package br.com.rhinovet.faces;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import br.com.rhinovet.bean.NotificacaoBean;
import br.com.rhinovet.entidade.ProcedimentoConsulta;
import br.com.rhinovet.logica.contract.DefaultLogicaContract;
import br.com.rhinovet.logica.contract.EmailLogicaContract;
import br.com.rhinovet.logica.contract.NotificacaoLogicaContract;
import br.com.rhinovet.util.FacesUtil;
import br.com.rhinovet.util.StringUtil;

@ManagedBean(name = "notificacaoFaces")
@ViewScoped
public class NotificacaoFaces extends FacesUtil {

	private static final long serialVersionUID = 1L;

	private List<NotificacaoBean> listaNotificacoes = new ArrayList<>();

	@ManagedProperty(value = "#{notificacaoLogica}")
	private NotificacaoLogicaContract notificacaoLogica;
	
	@ManagedProperty(value = "#{emailLogica}")
	private EmailLogicaContract logicaEmail;

	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<ProcedimentoConsulta> logicaProcedimentoConsulta;
	
	private String proprietarioEmail;
	private ProcedimentoConsulta procedimentoConsulta;
	
	private String detalheObservacoes;
	private String detalheAnamnese;
	private boolean temAnamnese;

	
	@PostConstruct
	public void init() {
		this.buscarNotificacoes();
	}

	public void buscarNotificacoes() {
		if (!listaNotificacoes.isEmpty()) {
			listaNotificacoes.clear();
		}
		listaNotificacoes.addAll(notificacaoLogica.buscarNotificacoesPendentes());
	}
	
	public void enviarEmail(NotificacaoBean notificacao) {
		Long idNotificacao = notificacao.getId();

		try {
			procedimentoConsulta = logicaProcedimentoConsulta.obterPorId(ProcedimentoConsulta.class, idNotificacao);
			logicaEmail.enviarEmailProcedimentoConsulta(procedimentoConsulta);
			adicionarMensagem("Email enviado com sucesso para: " + procedimentoConsulta.getConsulta().getProprietario().getEmail());
		} catch (Exception e) {
			adicionarMensagem("Erro ao enviar o email");
		}
	}
	
	public void exibirDetalhes(Long idProcedimentoConsulta) {
		
		try {
			ProcedimentoConsulta procedimentoConsulta = logicaProcedimentoConsulta.obterPorId(ProcedimentoConsulta.class, idProcedimentoConsulta);
			this.detalheAnamnese = procedimentoConsulta.getAnamnese();
			
			if (StringUtil.textoPreenchido(this.detalheAnamnese)) {
				this.temAnamnese = true;
			} else {
				this.temAnamnese = false;
			}
			this.detalheObservacoes = procedimentoConsulta.getObservacao();
			abrirModal("dialogDetalhes");
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao obter os dados solicitados");
		}
	}

	
	public void setLogicaProcedimentoConsulta(DefaultLogicaContract<ProcedimentoConsulta> logicaProcedimentoConsulta) {
		this.logicaProcedimentoConsulta = logicaProcedimentoConsulta;
	}

	public List<NotificacaoBean> getListaNotificacoes() {
		return listaNotificacoes;
	}

	public void setListaNotificacoes(List<NotificacaoBean> listaNotificacoes) {
		this.listaNotificacoes = listaNotificacoes;
	}

	public void setNotificacaoLogica(NotificacaoLogicaContract notificacaoLogica) {
		this.notificacaoLogica = notificacaoLogica;
	}

	public void setLogicaEmail(EmailLogicaContract logicaEmail) {
		this.logicaEmail = logicaEmail;
	}

	public String getProprietarioEmail() {
		return proprietarioEmail;
	}

	public void setProprietarioEmail(String proprietarioEmail) {
		this.proprietarioEmail = proprietarioEmail;
	}

	public ProcedimentoConsulta getProcedimentoConsulta() {
		return procedimentoConsulta;
	}

	public void setProcedimentoConsulta(ProcedimentoConsulta procedimentoConsulta) {
		this.procedimentoConsulta = procedimentoConsulta;
	}

	public String getDetalheObservacoes() {
		return detalheObservacoes;
	}

	public void setDetalheObservacoes(String detalheObservacoes) {
		this.detalheObservacoes = detalheObservacoes;
	}

	public String getDetalheAnamnese() {
		return detalheAnamnese;
	}

	public void setDetalheAnamnese(String detalheAnamnese) {
		this.detalheAnamnese = detalheAnamnese;
	}

	public boolean isTemAnamnese() {
		return temAnamnese;
	}

	public void setTemAnamnese(boolean temAnamnese) {
		this.temAnamnese = temAnamnese;
	}
	
	
}